package com.glory.erp.auth.menu.service.impl;

import java.io.Serializable;
import java.util.HashSet;
import java.util.List;
import java.util.Set;

import com.glory.erp.auth.menu.service.MenuService;
import com.glory.erp.auth.menu.dao.MenuDao;
import com.glory.erp.auth.menu.bean.Menu;
import com.glory.erp.auth.role.bean.Role;
import com.glory.erp.auth.base.BaseQueryModel;

public class MenuServiceImpl implements MenuService{
	
	private MenuDao menuDao;
	
	public void setMenuDao(MenuDao menuDao) {
		this.menuDao = menuDao;
	}

	// 废弃
	public void save(Menu menu) {
		menuDao.save(menu);
	}

	// 废弃
	public void update(Menu menu) {
		Menu m = menuDao.findById(menu.getUuid());
		m.setName(menu.getName());
		m.setUrl(menu.getUrl());
	}

	public void delete(Menu menu) {
		/*
		 * 完成级联删除的前提是 被删除对象级联的数据存在
		 * 删除id为 ** 时，对应的对象应该级联哪些必须是已知的，此时对象中的关系数据存在
		 * menu对象此时只有uuid，并没有关系数据
		 * hibernate对于关系数据为空的处理方式是：断开所有关系，由于此时设置 inverse=true，又不维护关系
		 * 解决方案是：级联删除前 加载数据
		 */
		Menu m = menuDao.findById(menu.getUuid());
		menuDao.delete(m);
	}

	public Menu findById(Serializable uuid) {
		return menuDao.findById(uuid);
	}

	public List<Menu> findAll() {
		return menuDao.findAll();
	}

	public List<Menu> findAll(BaseQueryModel qm, Integer pageNum,Integer pageCount) {
		return menuDao.findAll(qm,pageNum,pageCount);
	}

	public Integer getCount(BaseQueryModel qm) {
		return menuDao.getCount(qm);
	}

	public List<Menu> findAllOneLevel() {
		return menuDao.findByPuuidIsOneOrZero();
	}

	public void save(Menu menu, Long[] roleUuids) {
		// array --> set
		Set<Role> roles = new HashSet<Role>();
		for (Long uuid : roleUuids) {
			Role role = new Role();
			role.setUuid(uuid);
			roles.add(role);
		}
		menu.setRoles(roles);
		menuDao.save(menu);
	}

	public void update(Menu menu, Long[] roleUuids) {
		Menu m = menuDao.findById(menu.getUuid());
		m.setName(menu.getName());
		m.setUrl(menu.getUrl());
		Set<Role> roles = new HashSet<Role>();
		for (Long uuid : roleUuids) {
			Role role = new Role();
			role.setUuid(uuid);
			roles.add(role);
		}
		m.setRoles(roles);
	}

	public List<Menu> findAllOneLevelByEmp(Long uuid) {
		return menuDao.findAllOneLevelByEmpUuid(uuid);
	}

	public List<Menu> findByEmpAndPuuid(Long uuid, Long puuid) {
		return menuDao.findByEmpUuidAndPuuid(uuid,puuid);
	}
}